Практическое задание 5: C4 Architecture & Database Design
🏗️ Архитектурное проектирование - Создание C4 диаграмм и проектирование базы данных
📋 Описание задания
Создать архитектурную документацию для вашего веб-приложения, используя C4 модель архитектуры. Спроектировать и документировать архитектуру базы данных с помощью ERD диаграмм. Создать полноценную техническую документацию, включающую контекстные диаграммы, диаграммы контейнеров и детальное проектирование БД.
🎯 Цели задания
- Изучение C4 модели архитектуры
- Создание архитектурных диаграмм
- Проектирование структуры базы данных
- Документирование технических решений
- Освоение инструментов для создания диаграмм
- Понимание связей между компонентами системы
- Развитие архитектурного мышления
📝 Требования к выполнению
Основные требования:
- Context Diagram (Level 1) - контекстная диаграмма системы с протоколами
- Container Diagram (Level 2) - диаграмма контейнеров с технологиями и портами
- ERD (Entity Relationship Diagram) - диаграмма сущностей и связей БД
- Database Schema - детальная схема базы данных с индексами
- Архитектурная документация - описание принятых решений и протоколов
- Инструменты - использование специализированных инструментов для создания диаграмм
C4 Architecture:
- Context Diagram - показать систему в контексте пользователей и внешних систем
- Container Diagram - показать высокоуровневую архитектуру с основными контейнерами
- Документация - описать архитектурные решения и обоснования
Database Design:
- ERD - показать все сущности, их атрибуты и связи
- Схема БД - детальные таблицы с полями, типами данных и ограничениями
- Связи - foreign keys, индексы, триггеры
- Нормализация - обоснование структуры БД
📊 Система оценивания
- Полное выполнение: Максимальная оценка (2 балла)
- Частичное выполнение: Преподаватель дает обратную связь и просит переделать
- Пересдача: Возможна после исправления замечаний
🛠 Технические требования
C4 Architecture:
Context Diagram (Level 1):
- Пользователи: веб-пользователи, администраторы, мобильные пользователи
- Внешние системы: email сервис, платежная система, внешние API, файловое хранилище
- Основная система: ваше веб-приложение
- Протоколы: HTTPS, SMTP, REST API
- Потоки данных: показать основные взаимодействия
Container Diagram (Level 2):
- Frontend: HTML/CSS/JS, React/Vue
- Backend API: Node.js/Express, Python/Django, PHP/Laravel
- Database: PostgreSQL, MySQL, MongoDB
- Cache: Redis, Memcached
- Nginx: Reverse proxy, статические файлы
- External Services: Email, Payment, Storage
- Протоколы: HTTP/HTTPS, WebSocket, TCP, Database protocols
- Технологии: указать конкретные технологии для каждого контейнера
Database Design:
ERD:
- Сущности
- Связи: one-to-many, many-to-many, one-to-one
- Атрибуты: поля, типы данных, ограничения
- Индексы: для производительности
Database Schema:
- Таблицы: детальная структура с полями
- Constraints: primary keys, foreign keys, unique constraints
- Indexes: для оптимизации запросов
- Протоколы доступа: HTTP/REST, WebSocket, Direct SQL
- Порты: указать порты для каждого сервиса
🔗 Полезные ресурсы
C4 Architecture:
- C4 Model - официальная документация C4 модели
- C4 Model Examples - примеры диаграмм
Database Design:
- Database Design Tutorial - основы проектирования БД
- ERD Best Practices - лучшие практики ERD
- Database Normalization - нормализация БД
Инструменты для диаграмм:
📋 Чек-лист выполнения
C4 Architecture:
- [ ] Создана Context Diagram с пользователями и внешними системами
- [ ] Указаны протоколы связи (HTTPS, SMTP, REST API)
- [ ] Создана Container Diagram с основными компонентами
- [ ] Указаны технологии для каждого контейнера
- [ ] Указаны порты и протоколы между контейнерами
- [ ] Документированы архитектурные решения
- [ ] Обоснован выбор технологий и протоколов
Database Design:
- [ ] Создан ERD с основными сущностями
- [ ] Определены связи между сущностями
- [ ] Создана детальная схема БД
- [ ] Добавлены индексы для производительности
- [ ] Обоснована нормализация БД
Документация:
- [ ] Создана архитектурная документация
- [ ] Описаны технические решения
- [ ] Документированы ограничения и компромиссы
- [ ] Добавлены примеры использования
Инструменты:
- [ ] Диаграммы экспортированы в удобном формате
- [ ] Созданы шаблоны для будущего использования
- [ ] Документация структурирована и читаема
🧪 Тестирование
Обязательные проверки:
- Context Diagram - все пользователи и внешние системы учтены, указаны протоколы
- Container Diagram - архитектура соответствует реальной системе, указаны технологии и порты
- ERD - все сущности и связи корректны, нормализация соблюдена
- Database Schema - схема БД детализирована и оптимизирована, есть индексы
- Протоколы - все протоколы связи указаны и обоснованы
- Документация - все решения обоснованы и задокументированы
Дополнительные проверки:
- Соответствие C4 модели
- Качество диаграмм (читаемость, полнота)
- Производительность БД (индексы, оптимизация)
- Масштабируемость архитектуры
- Безопасность решений
🚀 Примеры диаграмм
Context Diagram Example:
graph TB
WebUser[Web User] -->|HTTPS| System[Web Application]
Admin[Admin User] -->|HTTPS| System
Mobile[Mobile User] -->|HTTPS| System
System -->|SMTP| Email[Email Service]
System -->|HTTPS/REST| Payment[Payment Gateway]
System -->|HTTPS/REST| Storage[File Storage]
System -->|HTTPS/REST| External[External APIs]
Container Diagram Example:
graph TB
User[User] -->|HTTPS| Nginx[Nginx<br/>Reverse Proxy<br/>Port 80/443]
Nginx -->|HTTP| Frontend[Frontend<br/>HTML/CSS/JS<br/>React/Vue]
Nginx -->|HTTP/WebSocket| Backend[Backend API<br/>Node.js/Express<br/>Port 3000]
Backend -->|TCP/PostgreSQL| Database[(PostgreSQL<br/>Database<br/>Port 5432)]
Backend -->|TCP/Redis| Redis[(Redis<br/>Cache<br/>Port 6379)]
Backend -->|HTTPS/REST| Email[Email Service<br/>SMTP]
Backend -->|HTTPS/REST| Storage[File Storage<br/>AWS S3]
ERD Example:
-- Пример ERD для чат-приложения с протоколами доступа
Table users {
id integer [primary key]
username varchar(50) [unique, not null]
email varchar(100) [unique, not null]
password_hash varchar(255) [not null]
avatar_url varchar(255)
is_online boolean [default: false]
last_seen timestamp [default: now()]
created_at timestamp [default: now()]
updated_at timestamp [default: now()]
indexes {
username [unique]
email [unique]
is_online
}
}
Table rooms {
id integer [primary key]
name varchar(100) [not null]
description text
created_by integer [ref: > users.id]
is_private boolean [default: false]
max_members integer [default: 100]
created_at timestamp [default: now()]
indexes {
created_by
is_private
}
}
Table messages {
id integer [primary key]
room_id integer [ref: > rooms.id]
user_id integer [ref: > users.id]
message text [not null]
message_type varchar(20) [default: 'text']
reply_to integer [ref: > messages.id]
created_at timestamp [default: now()]
edited_at timestamp
is_deleted boolean [default: false]
indexes {
room_id
user_id
created_at
message_type
}
}
Table user_rooms {
user_id integer [ref: > users.id]
room_id integer [ref: > rooms.id]
joined_at timestamp [default: now()]
role varchar(20) [default: 'member']
indexes {
(user_id, room_id) [unique]
user_id
room_id
}
}